//
// Created by 王筱童 on 2022/5/10.
//

#ifndef TINY_REDIS_SERVER_CMAKE_DATABASE_H
#define TINY_REDIS_SERVER_CMAKE_DATABASE_H
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <string>
#include <list>
#include <vector>
class database {
private:
    typedef std::unordered_map<std::string,std::string> key_value_map;
    typedef std::unordered_map<std::string,key_value_map> hash_table;
    typedef std::unordered_map<std::string,std::list<std::string>> list;
    typedef std::unordered_map<std::string,std::unordered_set<std::string>> set;
    typedef std::unordered_map<std::string,std::set<std::string>> zset;

    key_value_map db_kv;
    hash_table db_hash;
    list db_list;
    set db_set;
    zset db_zset;
public:
    bool SET(const std::string&key,const std::string&value);
    std::pair<bool, std::string> GET(const std::string&key);
    bool DEL(const std::string&key);
    bool EXISTS(const std::string&key);
    std::pair<bool,std::string> HGET(const std::string& key,const std::string& field);
    bool HSET(const std::string&key,const std::string&field,const std::string&value);
    bool HEXISTS(const std::string&key,const std::string& field);
    bool HDEL(const std::string&key,const std::string&field);
    std::size_t HLEN(const std::string& key);
    std::vector<std::string> HGETALL(const std::string&key);
    std::size_t LLEN(const std::string&key);
    bool LPUSH(const std::string&key,const std::string&value );
    bool LPOP(const std::string& key);
    std::vector<std::string> LRANGE(const std::string &key,std::size_t begin,std::size_t end);
    std::string LINDEX(const std::string&key,std::size_t index);
    bool RPUSH(const std::string&key,const std::string&val);
    bool RPOP(const std::string& key);
    bool SADD(const std::string& key,const std::string& val);
    std::size_t SCARD(const std::string&key);
    bool SREM(const std::string&key,const std::string&val);
    bool SCLR(const std::string& key);
    std::vector<std::string> SGET(const std::string&key);
    bool ZADD(const std::string& key,const std::string& val);
    std::vector<std::string> ZRANGE(const std::string&key ,const std::string& begin,const std::string& end);
    std::size_t ZCARD(const std::string&key);
    bool ZREM(const std::string&key,const std::string&val);
    bool ZCLR(const std::string& key);
    std::vector<std::string> ZGET(const std::string&key);
    ~database();
};


#endif //TINY_REDIS_SERVER_CMAKE_DATABASE_H
